package com.zf.nospring.rabbitmq.utils;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author Zhou Feng
 */
public class RabbitUtils {
    /**
     * 创建连接
     */
    public static Connection getDefaultConnection() throws IOException, TimeoutException {
        // 1、创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 2、设置连接参数
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("/rabbitmq-sample-vh");
        // 3、创建连接 Connection，一个连接中可以包含多个通道，通过通道进行消息的读取和发送
        Connection connection = connectionFactory.newConnection();
        return connection;
    }

    /**
     * 创建一个默认的消费逻辑
     *
     * @param channel 通道
     */
    public static DefaultConsumer getDefaultConsumer(Channel channel) {
        // 创建消费者的消费逻辑
        return new DefaultConsumer(channel) {
            /**
             * 当通道中有从队列中获取到的消息时就会执行该方法处理消息，每次处理通道中的一条消息
             * @param consumerTag 消费者标识：每个消费通道就是一个消费者，他们的 consumerTag 不同；如果同一个通道消费不同的队列，那么就是两个消费者，他们的 consumerTag 也不同
             * @param envelope 消息相关的信息：
             *                  - _exchange：交换机，
             *                  - _routingKey：发送消息时的路由键，
             *                  - _redeliver：是否是重新入队的消息，
             *                  - _deliveryTag：消息的标识，基于通道，每个通道都是从1开始，当前通道每处理一条消息值就+1, 用于消息的消费确认
             * @param properties 消息的属性，如类型、编码、过期时间等
             * @param body 消息本体
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.printf("channel: %s\n consumerTag：%s\n envelope: %s\n properties: %s\n msg: %s\n",
                        getChannel(), consumerTag, envelope, properties, new String(body));
            }
        };
    }
}
